﻿using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TI_4_Limonade_Fabriek.Logging;
using TI_4_Limonade_Fabriek.Model;

namespace TI_4_Limonade_Fabriek.Database
{
    class UserDBController : DatabaseController
    {
        #region Variabelen declaractie
        private ErrorLogging el;
        #endregion

        //Publieke constructor
        public UserDBController()
        {
            el = new ErrorLogging();
        }
        //Methode om een gebruiker aan te maken in de database.
        public void CreateUser(User user)
        {
            try
            {
                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd, met parameters.
                string insertString = @"INSERT INTO `Gebruiker` (`Username`, `Password`, `UserRole`) VALUES (@username, @password, @userrole);";

                //Voor elke variabele een MySqlParameter aanmaken.
                MySqlParameter usernameParam = new MySqlParameter("@username", MySqlDbType.VarChar);
                MySqlParameter passwordParam = new MySqlParameter("@password", MySqlDbType.VarChar);
                MySqlParameter userroleParam = new MySqlParameter("@userrole", MySqlDbType.Int32);

                //Waardes toewijzen aan de parameters vanuit het User object.
                usernameParam.Value = user.Username;
                passwordParam.Value = user.Password;
                userroleParam.Value = user.UserRole;

                //Lijst creëren voor alle parameters en alle parameters toevoegen.
                List<MySqlParameter> parameterList = new List<MySqlParameter>();
                parameterList.Add(usernameParam);
                parameterList.Add(passwordParam);
                parameterList.Add(userroleParam);

                //Aanroepen functie voor uitvoeren query.
                ExecuteQueryWithoutResult(insertString, parameterList);

                //Connectie met MySql server verbreken.
                Disconnect();
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
            }
        }

        //Methode om alle users uit de database op te halen en in een lijst terug te geven.
        public List<User> ReadUserList()
        {
            try
            {
                List<User> userList = new List<User>();

                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd.
                string selectString = "SELECT * FROM Gebruiker";

                //Query uitvoeren en resultaat in een MySqlDatareader stoppen.
                MySqlDataReader reader = ExecuteQueryWithResult(selectString, null);

                //Loopen door de DataReader om alle gegevens op te halen en in een User Object te zetten.
                while (reader.Read())
                {
                    int _UID = reader.GetInt32("UId");
                    string _Username = reader.GetString("Username");
                    int _UserRole = reader.GetInt32("UserRole");

                    User user = new User { Uid = _UID, Username = _Username, UserRole = _UserRole };

                    //User object toevoegen aan de lijst.
                    userList.Add(user);
                }

                //De datareader sluiten en de connectie met MySql server verbreken.
                reader.Close();
                Disconnect();

                return userList;
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
                return null;
            }
        }

        //Methode om een enkele user uit de database op te halen aan de hand van Uid.
        /*
         * Deze functie is leeg omdat deze niet nodig was voor de huidige versie van dit systeem.
         * De methode is gedeclareerd voor volgende uitbreidingen.
         */
        public User ReadUser(int Uid)
        {
            return null;
        }

        //Methode om een enkele user uit de database te bewerken aan de hand van Uid.
        /*
         * Deze functie is leeg omdat deze niet nodig was voor de huidige versie van dit systeem.
         * De methode is gedeclareerd voor volgende uitbreidingen.
         */
        public void UpdateUser(int UId)
        {

        }

        //Methode om een enkele user uit de database te verwijderen aan de hand van Uid.
        public void DeleteUser(int UId)
        {
            try
            {
                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd.
                string deleteString = "DELETE FROM Gebruiker WHERE UId = @uid";

                //Aanmaken parameter voor de variabele en waarde eraan toewijzen.
                MySqlParameter uidParam = new MySqlParameter("@uid", MySqlDbType.Int32);
                uidParam.Value = UId;

                //Lijst voor parameters maken en de parameter toevoegen.
                List<MySqlParameter> parameterList = new List<MySqlParameter>();
                parameterList.Add(uidParam);

                //Aanroepen functie voor uitvoeren query.
                ExecuteQueryWithoutResult(deleteString, parameterList);

                //Connectie met MySql server verbreken.
                Disconnect();
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
            }
        }

        public User CheckLogin(User user)
        {
            try
            {
                //Opent connectie met MySql server.
                Connect();

                //De query die uit moet worden gevoerd.
                string selectString = "SELECT * FROM Gebruiker WHERE Username = @username AND Password = @password";

                //Aanmaken parameter voor de variabele en waarde eraan toewijzen.
                MySqlParameter usernameParam = new MySqlParameter("@username", MySqlDbType.VarChar);
                MySqlParameter passwordParam = new MySqlParameter("@password", MySqlDbType.VarChar);
                usernameParam.Value = user.Username;
                passwordParam.Value = user.Password;

                //Lijst voor parameters maken en de parameter toevoegen.
                List<MySqlParameter> parameterList = new List<MySqlParameter>();
                parameterList.Add(usernameParam);
                parameterList.Add(passwordParam);

                //Query uitvoeren en resultaat in een MySqlDatareader stoppen.
                MySqlDataReader reader = ExecuteQueryWithResult(selectString, parameterList);

                //Checken of de datareader enige data bevat, zo niet dan return null.
                if (reader.HasRows)
                {
                    //Als er data is dan de overige data aan het object toevoegen.
                    while (reader.Read())
                    {
                        int _Uid = reader.GetInt32("Uid");
                        int _UserRole = reader.GetInt32("UserRole");

                        user.Uid = _Uid;
                        user.UserRole = _UserRole;
                    }
                    
                    //Readers sluiten en verbinding verbreken met MySql database.
                    reader.Close();
                    Disconnect();

                    return user;
                }
                else
                {
                    Disconnect();
                    return null;
                }
            }
            catch (Exception e)
            {
                //Verbinding verbreken met MySql server en de error message loggen.
                Disconnect();
                el.LogErrorMsg(e.ToString());
                return null;
            }

        }
    }
}
